/*
 * @Author: Wangjun
 * @Date: 2023-08-16 14:33:22
 * @LastEditTime: 2023-10-26 18:09:04
 * @LastEditors: Wangjun
 * @Description:
 * @FilePath: \xr_node_calcd:\go\src\gitee.com\hnxr_1\nodex\nodectrl\op_dlt.go
 * hnxr
 */
package nodectrl

import (
	"errors"

	"gitee.com/hnxr_1/nodex"
)

func init() {
	nodex.Reister(new(DLT))
}

type DLT struct {
	nodex.Node
	X  nodex.Double `remark:"输入1"`
	T  nodex.Double `remark:"时间周期,1"`
	Y  nodex.Double `remark:"输出Y,,out"`
	l  int
	vs []float64
}

func (m *DLT) Init(mem *nodex.Memory) (err error) {
	if m.T.Value < 0 {
		err = errors.New("输入超低限错误")
		m.Bad = true
		return
	}
	if int(m.T.Value) > 0 {
		m.vs = make([]float64, int(m.T.Value))
	}
	m.l = int(m.T.Value) - 1
	m.UID = m.MakeUID()
	m.Ptr = &m.vs
	if mem == nil {
		return
	}
	if mem.UID != m.UID {
		return
	}
	if vs, ok := mem.Ptr.([]float64); ok {
		copy(m.vs, vs)
	}
	return
}

func (m *DLT) GetModelID() int {
	return nodex.ModControl
}

/**
 * @description:
 * @return {*}
 */
func (m *DLT) GetName() string {
	return "DLT"
}

func (m *DLT) RegData() []byte {
	return nodex.MakeRegData(m, "延时平移器", m.GetName(), "")
}

func (m *DLT) Calc() (err error) {
	if m.EnQ {
		if *m.X.Bad || *m.T.Bad {
			m.Bad = true
			return //不计算
		}
	}
	m.Bad = false
	if m.l < 0 {
		m.Y.Value = m.X.Value
		return
	}

	m.Y.Value = m.vs[m.l]
	return
}
